package com.zhixi.config;

import com.zhixi.datasource.DynamicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zhixi
 * Spring相关配置
 */
@Configuration
public class DataSourceConfig {

    /**
     * 为每个数据源单独设置一个Bean
     *
     * @return 数据源1
     */
    @ConfigurationProperties("datasource1")
    @Bean
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 为每个数据源单独设置一个Bean
     *
     * @return 数据源2
     */
    @Bean
    @ConfigurationProperties("datasource2")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 添加数据源
     *
     * @return 自定义数据源
     */
    @Bean
    public DynamicDataSource dynamicDataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("ds1", dataSource1());
        targetDataSources.put("ds2", dataSource2());

        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        // 设置目标数据源
        dynamicDataSource.setTargetDataSources(targetDataSources);
        // 设置默认目标数据源
        dynamicDataSource.setDefaultTargetDataSource(dataSource1());
        return dynamicDataSource;
    }

    /**
     * 使用DynamicDataSource作为数据源。
     *
     * @param dynamicDataSource 数据源
     * @return 配置好的SqlSessionFactoryBean对象，以便将其用作MyBatis框架的数据源。
     * @throws IOException 异常
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DynamicDataSource dynamicDataSource) throws IOException {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        /*设置mybatis configuration 扫描路径 */
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        //加载配置文件的地址
        bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        bean.setDataSource(dynamicDataSource);
        return bean;
    }


    /**
     * 使用返回的数据源创建一个DataSourceTransactionManager对象。
     * DataSourceTransactionManager是Spring提供的事务管理器，用于管理基于数据源的事务
     * @return 事务管理器
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dynamicDataSource());
    }
}
